package com.pactera.jep.service.sys.web.controller;

import com.pactera.jep.autoconfigure.web.controller.BaseRestController;
import com.pactera.jep.entity.Treeable;
import com.pactera.jep.orm.Filter;
import com.pactera.jep.service.sys.dto.BizTypeDto;
import com.pactera.jep.sys.model.BizType;
import com.pactera.jep.sys.service.BizTypeService;
import com.pactera.jep.web.code.WebCode;
import com.pactera.jep.web.entity.TreeNode;
import com.pactera.jep.web.util.TreeUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Api(value="业务种类管理")
@RestController
@RequestMapping("/bizType")
public class BizTypeRestController extends BaseRestController<BizType> {
	Logger logger = LoggerFactory.getLogger(BizTypeRestController.class);

	@Autowired
	private BizTypeService	bizTypeService;

	/**
	 * 获取当前用户能访问的菜单
	 * @return
	 */
	@ApiOperation(value = "加载数据")
	@GetMapping("/load")
	public List<BizTypeDto> load()
	{
		List<BizTypeDto> bizTypeDtos = new ArrayList<>();

		List<BizType> bizTypes= bizTypeService.selectAll();
		for(BizType bizType : bizTypes)
		{
			BizTypeDto bizTypeDto = new BizTypeDto();

			bizTypeDto.setId(bizType.getBizTypeCode());
			bizTypeDto.setTitle(bizType.getBizTypeName());
			if(StringUtils.isNotBlank(bizType.getParentId()))
			{
				String parentName = bizTypeService.get(bizType.getParentId()).getBizTypeName();
				bizTypeDto.setParentName(parentName);
			}
			bizTypeDto.setParentId(bizType.getParentId());
			bizTypeDto.setBizTypeCode(bizType.getBizTypeCode());
			bizTypeDto.setBizTypeName(bizType.getBizTypeName());
			bizTypeDto.setStatus(bizType.getStatus());
			bizTypeDto.setRemark(bizType.getRemark());

			bizTypeDtos.add(bizTypeDto);
		}
		return generateAppConfigDto(null, bizTypeDtos);
	}
	private List<BizTypeDto> generateAppConfigDto(BizTypeDto parent, List<BizTypeDto> bizTypeDtos){

		List<BizTypeDto> data = new ArrayList<>();

		for(BizTypeDto bizTypeDto : bizTypeDtos){
			if(parent != null && parent.getId().equals(bizTypeDto.getParentId()))
			{
				bizTypeDto.setChildren(generateAppConfigDto(bizTypeDto, bizTypeDtos));
				data.add(bizTypeDto);
			}
			else if(parent == null && StringUtils.isBlank(bizTypeDto.getParentId())){
				bizTypeDto.setChildren(generateAppConfigDto(bizTypeDto, bizTypeDtos));
				data.add(bizTypeDto);
			}
		}
		return data;
	}

	/**
	 * 移除业务种类表节点
	 * @param bizTypeCode
	 * @return
	 */
	@ApiOperation(value = "移除业务种类表节点")
	@PostMapping(value = "/removeNode/{bizTypeCode}")
	public Map<String, Object> removeNode(@PathVariable String bizTypeCode) {
		Map<String, Object> tips = new HashMap<String, Object>();

		/*查询当前节点是否有子节点*/
		long count = bizTypeService.count(new Filter.Builder().eq("parentId", bizTypeCode).build());

		/*总数大于0，提示先删除子节点，反之进行删除*/
		if(count > 0)
		{
			tips.put(WebCode.SUCCESS, false);
			tips.put(WebCode.MSG, WebCode.DELETE_SUBNODE_FIRST);
		}
		else
		{
			bizTypeService.deleteByPrimaryKey(bizTypeCode);
			tips.put(WebCode.SUCCESS, true);
			tips.put(WebCode.MSG, WebCode.SUCCESS_DELETE);
		}
		return tips;
	}

	/**
	 * 重命名节点
	 * @param bizTypeCode 节点key
	 * @param newName 节点新的名称
	 * @return
	 */
	@ApiOperation(value = "重命名节点")
	@PostMapping(value = "/renameNode/{bizTypeCode}")
	public Map<String, Object> renameNode(@PathVariable String bizTypeCode, String newName) {
		Map<String, Object> tips = new HashMap<String, Object>();
		try
		{
			BizType bizType= new BizType();
			bizType.setBizTypeCode(bizTypeCode);
			bizType.setBizTypeName(newName);
			bizTypeService.update(bizType, new String[]{"BizTypeName"});

			tips.put(WebCode.SUCCESS, true);
			tips.put(WebCode.MSG, WebCode.SUCCESS_RENAME);
		}
		catch(Exception ex)
		{
			tips.put(WebCode.SUCCESS, false);
			tips.put(WebCode.MSG, WebCode.FAULURE_RENAME);
		}
		return tips;
	}

	/**
	 * 新增节点
	 * @param bizType
	 * @return
	 */
	@ApiOperation(value = "新增节点")
	@PostMapping(value = "/updateNode")
	public Map<String, Object> updateNode(@RequestBody BizType bizType) {
		Map<String, Object> tips = new HashMap<String, Object>();
		try
		{
			BizType exist = bizTypeService.get(bizType.getBizTypeCode());
			/*判断当前对象是否存在, 不存在就添加*/
			if(exist == null)
			{
				bizTypeService.insert(bizType);
			}
			else
			{
				bizTypeService.update(bizType);
			}

			tips.put(Treeable.TREE_ID, bizType.getBizTypeCode());
			tips.put(WebCode.SUCCESS, true);
			tips.put(WebCode.MSG, WebCode.SUCCESS_SAVE);
		}
		catch(Exception ex)
		{
			tips.put(WebCode.SUCCESS, false);
			tips.put(WebCode.MSG, WebCode.FAILURE_SAVE);
		}
		return tips;
	}

	/**
	 * 初始化加载数据
	 * @param parentId
	 * @param request
	 * @return
	 */
	@ApiOperation(value = "异步加载数据")
	@GetMapping(value = "/treeNode")
	public List<TreeNode> treeNode(String parentId, HttpServletRequest request) {
		List<Filter> filters = null;
		if(org.apache.commons.lang.StringUtils.isEmpty(parentId))
		{
			filters = new Filter.Builder().nl("parentId").build();
		}
		else
		{
			filters = new Filter.Builder().eq("parentId", parentId).build();
		}

		List<BizType> list = bizTypeService.select(filters);

		String[] columns = new String[]{
				"bizTypeCode",
				"bizTypeName",
				"parentId",
				"status",
				"remark",
		};
		List<TreeNode> nodes = TreeUtils.parse(list, columns);

		return nodes;
	}
}